智乐活

初识 Zookeeper

2017/05/09 Share

Zookeeper 中的概念

Zookeeper是apache下的一个分布式系统协调框架,被广泛应用到Hadoop、HBase、Kafka、Dubbo等分布式系统中,用于系统各个模块间的协调工作。

Zookeeper提供的API比较原始,这也意味着使用者有很大的灵活性来让它发挥各种功能。

数据节点

  • Zookeeper可以看做一个高可用的分布式文件系统,每个文件叫做一个节点。既然是文件系统,节点之间是存在父子关系的,整体组成一个树形结构,如下图:
  • 每个节点都可以保存小于1M的数据。

  • 节点可分为临时/永久节点,顺序/非顺序节点。

    临时节点:在客户端会话中断后会被自动删除,可以此判断某些机器/应用的上下线状态

    顺序节点:创建节点时Zookeeper可自动为节点名称添加顺序后缀,如”-000001”,可以此实现分布式锁、分布式队列等等需求。

消息通知

  • 当节点数据发生变更时,Zookeeper会给订阅了此事件的客户端发送通知。包括的事件类型有:
    1. 节点创建
    2. 节点删除
    3. 节点数据变更
    4. 子节点列表变更

部署方式

  • 可部署在多个机器上,形成集群。
  • 在大于一半的机器正常运行时,集群可正常提供服务
  • 客户端在连接Zookeeper服务时,提供一串host:port地址,客户端可自动实现失败重连,且连接的不是某一个特定服务器。

Zookeeper 的 Java API

1.创建节点(create)

2.删除节点(delete)

3.获取子节点列表(getChildren)

获取时可选择监听子节点列表变化的事件

4.获取数据(getData)

5.更新数据(setData)

注意更新数据时,需要传入version参数。version相当于CAS操作中check的预期值,可用于解决分布式同步更新问题。当version值为-1时表示不需要检查操作。

6.检测节点是否存在(exists)

可在此监听节点创建、更新、删除操作。关于子节点的变化不会在这个接口处通知

7.权限控制

addAuthInfo()方法。

特殊:对于删除操作而言,权限控制适用于目标节点的子节点。目标节点仍然能被自由地删除

开源客户端

ZkClient

  • 将会话创建过程同步化
  • 实现序列化机制
  • 功能更方便的API方法
  • listener一次注册,一直有效

Curator

  • Apache的顶级项目,广泛使用
  • 封装了细节操作,fluent风格的API
  • 实现了高级应用场景的功能:master选举、分布式锁、分布式计数器、分布式Barrier

参考书:《从PAXOS到ZOOKEEPER分布式一致性原理与实践》


遗留问题:

  • client如果访问到了一个server,它内存中的数据此时还不是最新的,会怎么样?会先进行同步吗?
CATALOG
  1. 1. Zookeeper 中的概念
    1. 1.1. 数据节点
    2. 1.2. 消息通知
    3. 1.3. 部署方式
  2. 2. Zookeeper 的 Java API
    1. 2.1. 1.创建节点(create)
    2. 2.2. 2.删除节点(delete)
    3. 2.3. 3.获取子节点列表(getChildren)
    4. 2.4. 4.获取数据(getData)
    5. 2.5. 5.更新数据(setData)
    6. 2.6. 6.检测节点是否存在(exists)
    7. 2.7. 7.权限控制
  3. 3. 开源客户端
    1. 3.1. ZkClient
    2. 3.2. Curator